#include <iostream>
#include <signal.h>
#include <unistd.h>

using namespace std;

void PrintPending(const sigset_t& pending)
{
    cout << "Pending: ";
    for (size_t i=31; i>=1; --i) {
        if(sigismember(&pending, i)) 
            cout << "1";
        else 
            cout << "0";
    }
    cout << endl;
}

void handler(int signo) 
{
    cout << "Catch a signal:" << signo << endl;
}

int main()
{
    signal(2, handler);
    // 1. 数据预备
    sigset_t set, oset;
    sigemptyset(&set);
    sigemptyset(&oset);
    sigaddset(&set, 2);
    // 2. 调用系统调用，将数据社至进内核，对2号信号进行屏蔽
    sigprocmask(SIG_BLOCK, &set, &oset);
    // 3. 重复打印当前进程的pending 0000000000000000000000000
    sigset_t pending;
    int cnt = 5;
    while(true) {
        sigpending(&pending);
        PrintPending(pending);
        cnt--;
        if(cnt == 0) {
            // 4. 发送2号0000000000000000000000010
            cout << "Send 2 signal" << endl;
            raise(2);
        }
        if(cnt == -5) {
            // 解除阻塞
            cout << "Unblock signal" << endl;
            // sigprocmask(SIG_SETMASK, &oset, nullptr);
            sigprocmask(SIG_UNBLOCK, &set, &oset);
        }
        sleep(1);
    }
    return 0;
}   